home *** CD-ROM | disk | FTP | other *** search
- #include "g_local.h"
- #include "m_player.h"
-
-
- void SelectNextItem (edict_t *ent)
- {
- gclient_t *cl;
- int i, index;
- gitem_t *it;
-
- cl = ent->client;
-
- // scan for the next valid one
- for (i=1 ; i<=MAX_ITEMS ; i++)
- {
- index = (cl->pers.selected_item + i)%MAX_ITEMS;
- if (!cl->pers.inventory[index])
- continue;
- it = &itemlist[index];
- if (!it->use)
- continue;
-
- cl->pers.selected_item = index;
- return;
- }
-
- cl->pers.selected_item = -1;
- }
-
- void SelectPrevItem (edict_t *ent)
- {
- gclient_t *cl;
- int i, index;
- gitem_t *it;
-
- cl = ent->client;
-
- // scan for the next valid one
- for (i=1 ; i<=MAX_ITEMS ; i++)
- {
- index = (cl->pers.selected_item + MAX_ITEMS - i)%MAX_ITEMS;
- if (!cl->pers.inventory[index])
- continue;
- it = &itemlist[index];
- if (!it->use)
- continue;
-
- cl->pers.selected_item = index;
- return;
- }
-
- cl->pers.selected_item = -1;
- }
-
-
-
- void ValidateSelectedItem (edict_t *ent)
- {
- gclient_t *cl;
-
- cl = ent->client;
-
- if (cl->pers.inventory[cl->pers.selected_item])
- return; // valid
-
- SelectNextItem (ent);
- }
-
-
- //=================================================================================
-
- /*
- ==================
- Cmd_Give_f
-
- Give items to a client
- ==================
- */
- void Cmd_Give_f (edict_t *ent)
- {
- char *name;
- gitem_t *it;
- int index;
- int i;
- qboolean give_all;
-
- if (deathmatch->value && !sv_cheats->value)
- {
- gi.cprintf (ent, PRINT_HIGH, "You must run the server with '+set cheats 1' to enable this command.\n");
- return;
- }
-
- name = gi.args();
-
- if (Q_stricmp(name, "all") == 0)
- give_all = true;
- else
- give_all = false;
-
- if (give_all || Q_stricmp(name, "health") == 0)
- {
- if (gi.argc() == 3)
- ent->health += atoi(gi.argv(2));
- else
- ent->health = ent->max_health;
- if (!give_all)
- return;
- }
-
- if (give_all || Q_stricmp(name, "weapons") == 0)
- {
- for (i=0 ; i<game.num_items ; i++)
- {
- it = itemlist + i;
- if (!it->pickup)
- continue;
- if (!(it->flags & IT_WEAPON))
- continue;
- ent->client->pers.inventory[i] += 1;
- }
- if (!give_all)
- return;
- }
-
- if (give_all || Q_stricmp(name, "ammo") == 0)
- {
- for (i=0 ; i<game.num_items ; i++)
- {
- it = itemlist + i;
- if (!it->pickup)
- continue;
- if (!(it->flags & IT_AMMO))
- continue;
- Add_Ammo (ent, it, 1000);
- }
- if (!give_all)
- return;
- }
-
- if (give_all || Q_stricmp(name, "armor") == 0)
- {
- gitem_armor_t *info;
-
- it = FindItem("Body Armor");
- info = (gitem_armor_t *)it->info;
- ent->client->pers.inventory[ITEM_INDEX(it)] = info->max_count;
-
- if (!give_all)
- return;
- }
-
- if (give_all)
- {
- for (i=0 ; i<game.num_items ; i++)
- {
- it = itemlist + i;
- if (!it->pickup)
- continue;
- if (it->flags & (IT_ARMOR|IT_WEAPON|IT_AMMO))
- continue;
- ent->client->pers.inventory[i] = 1;
- }
- return;
- }
-
- it = FindItem (name);
- if (!it)
- {
- name = gi.argv(1);
- it = FindItem (name);
- if (!it)
- {
- gi.dprintf ("unknown item\n");
- return;
- }
- }
-
- if (!it->pickup)
- {
- gi.dprintf ("non-pickup item\n");
- return;
- }
-
- index = ITEM_INDEX(it);
-
- if (it->flags & IT_WEAPON)
- {
- ent->client->pers.inventory[index] += 1;
- }
- else if (it->flags & IT_AMMO)
- {
- if (gi.argc() == 3)
- ent->client->pers.inventory[index] += atoi(gi.argv(2));
- else
- ent->client->pers.inventory[index] += it->quantity;
- }
- else
- {
- ent->client->pers.inventory[index] += 1;
- }
- }
-
-
- /*
- ==================
- Cmd_God_f
-
- Sets client to godmode
-
- argv(0) god
- ==================
- */
- void Cmd_God_f (edict_t *ent)
- {
- char *msg;
-
- if (deathmatch->value && !sv_cheats->value)
- {
- gi.cprintf (ent, PRINT_HIGH, "You must run the server with '+set cheats 1' to enable this command.\n");
- return;
- }
-
- ent->flags ^= FL_GODMODE;
- if (!(ent->flags & FL_GODMODE) )
- msg = "godmode OFF\n";
- else
- msg = "godmode ON\n";
-
- gi.cprintf (ent, PRINT_HIGH, msg);
- }
-
-
- /*
- ==================
- Cmd_Notarget_f
-
- Sets client to notarget
-
- argv(0) notarget
- ==================
- */
- void Cmd_Notarget_f (edict_t *ent)
- {
- char *msg;
-
- if (deathmatch->value && !sv_cheats->value)
- {
- gi.cprintf (ent, PRINT_HIGH, "You must run the server with '+set cheats 1' to enable this command.\n");
- return;
- }
-
- ent->flags ^= FL_NOTARGET;
- if (!(ent->flags & FL_NOTARGET) )
- msg = "notarget OFF\n";
- else
- msg = "notarget ON\n";
-
- gi.cprintf (ent, PRINT_HIGH, msg);
- }
-
-
- /*
- ==================
- Cmd_Noclip_f
-
- argv(0) noclip
- ==================
- */
- void Cmd_Noclip_f (edict_t *ent)
- {
- char *msg;
-
- if (deathmatch->value && !sv_cheats->value)
- {
- gi.cprintf (ent, PRINT_HIGH, "You must run the server with '+set cheats 1' to enable this command.\n");
- return;
- }
-
- if (ent->movetype == MOVETYPE_NOCLIP)
- {
- ent->movetype = MOVETYPE_WALK;
- msg = "noclip OFF\n";
- }
- else
- {
- ent->movetype = MOVETYPE_NOCLIP;
- msg = "noclip ON\n";
- }
-
- gi.cprintf (ent, PRINT_HIGH, msg);
- }
-
-
- /*
- ==================
- Cmd_Use_f
-
- Use an inventory item
- ==================
- */
- void Cmd_Use_f (edict_t *ent)
- {
- int index;
- gitem_t *it;
- char *s;
-
- s = gi.args();
- it = FindItem (s);
- if (!it)
- {
- gi.cprintf (ent, PRINT_HIGH, "unknown item: %s\n", s);
- return;
- }
- index = ITEM_INDEX(it);
- if (!ent->client->pers.inventory[index])
- {
- gi.cprintf (ent, PRINT_HIGH, "Out of item: %s\n", s);
- return;
- }
-
- it->use (ent, it);
- }
-
-
- /*
- ==================
- Cmd_Drop_f
-
- Drop an inventory item
- ==================
- */
- void Cmd_Drop_f (edict_t *ent)
- {
- int index;
- gitem_t *it;
- char *s;
-
- if (!(deathmatch->value)) // no dropping in single player
- return;
-
- s = gi.args();
- it = FindItem (s);
- if (!it)
- {
- gi.cprintf (ent, PRINT_HIGH, "unknown item: %s\n", s);
- return;
- }
- index = ITEM_INDEX(it);
- if (!ent->client->pers.inventory[index])
- {
- gi.cprintf (ent, PRINT_HIGH, "Out of item: %s\n", s);
- return;
- }
-
- it->drop (ent, it);
- }
-
-
- /*
- =================
- Cmd_Inven_f
- =================
- */
- void Cmd_Inven_f (edict_t *ent)
- {
- int i;
- gclient_t *cl;
-
- cl = ent->client;
-
- if (cl->showinventory)
- {
- cl->showinventory = false;
- return;
- }
-
- cl->showinventory = true;
- cl->showscores = false;
-
- gi.WriteByte (svc_inventory);
- for (i=0 ; i<MAX_ITEMS ; i++)
- {
- gi.WriteShort (cl->pers.inventory[i]);
- }
- gi.unicast (ent, true);
- }
-
- /*
- =================
- Cmd_InvUse_f
- =================
- */
- void Cmd_InvUse_f (edict_t *ent)
- {
- gitem_t *it;
-
- ValidateSelectedItem (ent);
-
- if (ent->client->pers.selected_item == -1)
- {
- gi.cprintf (ent, PRINT_HIGH, "No item to use.\n");
- return;
- }
-
- it = &itemlist[ent->client->pers.selected_item];
- if (!it->use)
- {
- gi.cprintf (ent, PRINT_HIGH, "Item is not usable.\n");
- return;
- }
- it->use (ent, it);
- }
-
- /*
- =================
- Cmd_WeapPrev_f
- =================
- */
- void Cmd_WeapPrev_f (edict_t *ent)
- {
- gclient_t *cl;
- int i, index;
- gitem_t *it;
- int selected_weapon;
-
- cl = ent->client;
-
- if (!cl->pers.weapon)
- return;
-
- selected_weapon = ITEM_INDEX(cl->pers.weapon);
-
- // scan for the next valid one
- for (i=1 ; i<=MAX_ITEMS ; i++)
- {
- index = (selected_weapon + i)%MAX_ITEMS;
- if (!cl->pers.inventory[index])
- continue;
- it = &itemlist[index];
- if (!it->use)
- continue;
- if (! (it->flags & IT_WEAPON) )
- continue;
- it->use (ent, it);
- if (cl->pers.weapon == it)
- return; // successful
- }
- }
-
- /*
- =================
- Cmd_WeapNext_f
- =================
- */
- void Cmd_WeapNext_f (edict_t *ent)
- {
- gclient_t *cl;
- int i, index;
- gitem_t *it;
- int selected_weapon;
-
- cl = ent->client;
-
- if (!cl->pers.weapon)
- return;
-
- selected_weapon = ITEM_INDEX(cl->pers.weapon);
-
- // scan for the next valid one
- for (i=1 ; i<=MAX_ITEMS ; i++)
- {
- index = (selected_weapon + MAX_ITEMS - i)%MAX_ITEMS;
- if (!cl->pers.inventory[index])
- continue;
- it = &itemlist[index];
- if (!it->use)
- continue;
- if (! (it->flags & IT_WEAPON) )
- continue;
- it->use (ent, it);
- if (cl->pers.weapon == it)
- return; // successful
- }
- }
-
- /*
- =================
- Cmd_InvDrop_f
- =================
- */
- void Cmd_InvDrop_f (edict_t *ent)
- {
- gitem_t *it;
-
- ValidateSelectedItem (ent);
-
- if (ent->client->pers.selected_item == -1)
- {
- gi.cprintf (ent, PRINT_HIGH, "No item to drop.\n");
- return;
- }
-
- it = &itemlist[ent->client->pers.selected_item];
- if (!it->drop)
- {
- gi.cprintf (ent, PRINT_HIGH, "Item is not dropable.\n");
- return;
- }
- it->drop (ent, it);
- }
-
- /*
- =================
- Cmd_Kill_f
- =================
- */
- void Cmd_Kill_f (edict_t *ent)
- {
- ent->flags &= ~FL_GODMODE;
- ent->health = 0;
- player_die (ent, ent, ent, 100000, vec3_origin);
- // don't even bother waiting for death frames
- ent->deadflag = DEAD_DEAD;
- respawn (ent);
- }
-
- /*
- =================
- Cmd_PutAway_f
- =================
- */
- void Cmd_PutAway_f (edict_t *ent)
- {
- ent->client->showscores = false;
- ent->client->showinventory = false;
- }
-
- /*
- =================
- Cmd_Wave_f
- =================
- */
- void Cmd_Wave_f (edict_t *ent)
- {
- int i;
-
- i = atoi (gi.argv(1));
-
- // can't wave when ducked
- if (ent->client->ps.pmove.pm_flags & PMF_DUCKED)
- return;
-
- if (ent->client->anim_priority > ANIM_WAVE)
- return;
-
- ent->client->anim_priority = ANIM_WAVE;
-
- switch (i)
- {
- case 0:
- gi.cprintf (ent, PRINT_HIGH, "flipoff\n");
- ent->s.frame = FRAME_flip01-1;
- ent->client->anim_end = FRAME_flip12;
- break;
- case 1:
- gi.cprintf (ent, PRINT_HIGH, "salute\n");
- ent->s.frame = FRAME_salute01-1;
- ent->client->anim_end = FRAME_salute11;
- break;
- case 2:
- gi.cprintf (ent, PRINT_HIGH, "taunt\n");
- ent->s.frame = FRAME_taunt01-1;
- ent->client->anim_end = FRAME_taunt17;
- break;
- case 3:
- gi.cprintf (ent, PRINT_HIGH, "wave\n");
- ent->s.frame = FRAME_wave01-1;
- ent->client->anim_end = FRAME_wave11;
- break;
- case 4:
- default:
- gi.cprintf (ent, PRINT_HIGH, "point\n");
- ent->s.frame = FRAME_point01-1;
- ent->client->anim_end = FRAME_point12;
- break;
- }
- }
-
- /*
- =================
- ClientCommand
- =================
- */
- void ClientCommand (edict_t *ent)
- {
- char *cmd;
-
- if (!ent->client)
- return; // not fully in game yet
-
- cmd = gi.argv(0);
- if (Q_stricmp (cmd, "use") == 0)
- Cmd_Use_f (ent);
- else if (Q_stricmp (cmd, "drop") == 0)
- Cmd_Drop_f (ent);
- else if (Q_stricmp (cmd, "give") == 0)
- Cmd_Give_f (ent);
- else if (Q_stricmp (cmd, "god") == 0)
- Cmd_God_f (ent);
- else if (Q_stricmp (cmd, "notarget") == 0)
- Cmd_Notarget_f (ent);
- else if (Q_stricmp (cmd, "noclip") == 0)
- Cmd_Noclip_f (ent);
- else if (Q_stricmp (cmd, "help") == 0)
- Cmd_Help_f (ent);
- else if (Q_stricmp (cmd, "inven") == 0)
- Cmd_Inven_f (ent);
- else if (Q_stricmp (cmd, "invnext") == 0)
- SelectNextItem (ent);
- else if (Q_stricmp (cmd, "invprev") == 0)
- SelectPrevItem (ent);
- else if (Q_stricmp (cmd, "invuse") == 0)
- Cmd_InvUse_f (ent);
- else if (Q_stricmp (cmd, "invdrop") == 0)
- Cmd_InvDrop_f (ent);
- else if (Q_stricmp (cmd, "weapprev") == 0)
- Cmd_WeapPrev_f (ent);
- else if (Q_stricmp (cmd, "weapnext") == 0)
- Cmd_WeapNext_f (ent);
- else if (Q_stricmp (cmd, "kill") == 0)
- Cmd_Kill_f (ent);
- else if (Q_stricmp (cmd, "putaway") == 0)
- Cmd_PutAway_f (ent);
- else if (Q_stricmp (cmd, "wave") == 0)
- Cmd_Wave_f (ent);
- else if (Q_stricmp (cmd, "gameversion") == 0)
- {
- gi.cprintf (ent, PRINT_HIGH, "%s : %s\n", GAMEVERSION, __DATE__);
- }
- else if (Q_stricmp (cmd, "fov") == 0)
- {
- ent->client->ps.fov = atoi(gi.argv(1));
- if (ent->client->ps.fov < 1)
- ent->client->ps.fov = 90;
- else if (ent->client->ps.fov > 160)
- ent->client->ps.fov = 160;
- }
- else
- gi.cprintf (ent, PRINT_HIGH, "Bad command: %s\n", cmd);
- }
-
-